package org.jeecg.modules.third.tosapi.service;

import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.modules.third.jg.report.freight.information.util.WebUtils;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.modules.third.aliyunocr.utils.HttpUtils;
import org.jeecg.modules.third.tosapi.constant.TosApiConstant;
import org.jeecg.modules.third.tosapi.constant.enums.EnergyTypeEnum;
import org.jeecg.modules.third.tosapi.constant.enums.PlateColorEnum;
import org.jeecg.modules.third.tosapi.constant.enums.YNEnum;
import org.jeecg.modules.third.tosapi.dto.TosApiBaseResDTO;
import org.jeecg.modules.third.tosapi.dto.TosApiTokenDTO;
import org.jeecg.modules.third.tosapi.dto.carrier.CarrierDTO;
import org.jeecg.modules.third.tosapi.dto.customer.CustomerDTO;
import org.jeecg.modules.third.tosapi.dto.driver.DriverDTO;
import org.jeecg.modules.third.tosapi.dto.invoice.InvoiceApplyDTO;
import org.jeecg.modules.third.tosapi.dto.invoice.InvoiceQueryDTO;
import org.jeecg.modules.third.tosapi.dto.shippingnote.ContractDTO;
import org.jeecg.modules.third.tosapi.dto.shippingnote.CreateShippingNoteDTO;
import org.jeecg.modules.third.tosapi.dto.shippingnote.EtcDTO;
import org.jeecg.modules.third.tosapi.dto.shippingnote.GeoDTO;
import org.jeecg.modules.third.tosapi.dto.shippingnote.PaymentDTO;
import org.jeecg.modules.third.tosapi.dto.shippingnote.SupplementDTO;
import org.jeecg.modules.third.tosapi.dto.shippingnote.TransportDetailDTO;
import org.jeecg.modules.third.tosapi.dto.vehicle.VehicleDTO;
import org.jeecg.modules.wlhy.utils.HyConfigUtils;
import org.jeecg.modules.wlhy.hyconfig.entity.HyConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;
import java.net.URL;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description: TODO
 * @author: luruirui
 * @date: 2021年07月16日 11:24
 */
@Service
@Slf4j
public class TosApiService {


    @Value(value = "${jeecg.path.upload}")
    private String uploadpath;

    @Value(value = "${tosapi.domian}")
    private String TOS_API_DOMIAN ;//= "https://gateway.gaea.test.xiaokuaikeji.com";
//    String TOS_API_DOMIAN = "https://gateway.gaea.kuaihuoyun.com/";


    @Autowired
    private RedisUtil redisUtil;
    /**
     * 获取Token
     * @return
     */
    public String getToken(){
        HyConfig systemConfig = HyConfigUtils.getConfig();
        if(systemConfig == null || !systemConfig.getTosapiIzUse()){
            throw new JeecgBootException("珠海快货运服务暂未开启,请联系管理员。");
        }
        Object tokenObject  = redisUtil.hasKey(TosApiConstant.TOSAPI_TOKEN_KEY) ?
                redisUtil.get(TosApiConstant.TOSAPI_TOKEN_KEY) : null;

        String token = StringUtils.EMPTY;
        if (tokenObject == null ) {

            String content = systemConfig.getTosapiAppkey() + ":" + systemConfig.getTosapiAppsecret();
            String basicToken = Base64.getEncoder().encodeToString(content.getBytes());

            String path = "/oauth/token";
            Map <String, String> headers = new HashMap <>();
            //最后在header中的格式(中间是英文空格)为Authorization:
            headers.put("Authorization", "Basic " + basicToken);
            //根据API的要求，定义相对应的Content-Type
            headers.put("Content-Type", "application/form-data");
            Map <String, String> querys = new HashMap <>();
            querys.put("grant_type", "open_api");
            querys.put("scope", "all");
            // 拼装请求body的json字符串
            String bodys = "";
//            log.info("getToken url:{} bodys:{}", TOS_API_DOMIAN + path, bodys);
            try {
                HttpResponse response = HttpUtils.doPost(TOS_API_DOMIAN, path, "POST", headers, querys, bodys);
                int stat = response.getStatusLine().getStatusCode();
                if (stat == 200) {
                    String res = EntityUtils.toString(response.getEntity());
//                    log.info("getToken res_obj:{} ", res);
                    JSONObject resObj = JSONObject.parseObject(res);
                    TosApiBaseResDTO resDTO = JSONObject.parseObject(res, TosApiBaseResDTO.class);
                    if (resDTO.isSuccess()) {
                        String data = resObj.getString("data");
                        TosApiTokenDTO tokenDTO = JSONObject.parseObject(data, TosApiTokenDTO.class);
//                        log.info("getToken tokenDTO:{}", tokenDTO);
                        redisUtil.set(TosApiConstant.TOSAPI_TOKEN_KEY, tokenDTO.getAccess_token(), tokenDTO.getExpires_in()- 18000);
                        redisUtil.set(TosApiConstant.TOSAPI_REFRESHTOKEN_KEY, tokenDTO.getRefresh_token(), tokenDTO.getExpires_in()- 18000);
                        return tokenDTO.getAccess_token();
                    }
                } else {
                    log.info("getToken Http code: {}  | http header error msg:{} | Http body error msg: ", stat,
                            response.getFirstHeader("X-Ca-Error-Message"), EntityUtils.toString(response.getEntity()));
                    //                resDTO.setMessage("HTTP请求失败！" + stat);
                }
            } catch (Exception e) {
                log.info("getToken Exception :{} ", e.getMessage());
            }
        }
        return tokenObject != null && StringUtils.isNotEmpty(tokenObject.toString())
                ? tokenObject.toString() : token;
    }
    /**
     * 刷新Token
     * @return
     */
    public String refreshToken(){
        HyConfig systemConfig = HyConfigUtils.getConfig();
        if(systemConfig == null || !systemConfig.getTosapiIzUse()){
            throw new JeecgBootException("珠海快货运服务暂未开启,请联系管理员。");
        }
        Object tokenObject  = redisUtil.hasKey(TosApiConstant.TOSAPI_REFRESHTOKEN_KEY) ?
                redisUtil.get(TosApiConstant.TOSAPI_REFRESHTOKEN_KEY) : null;
        if (tokenObject == null ) {
            return StringUtils.EMPTY;
        }

        String content = systemConfig.getTosapiAppkey() + ":" + systemConfig.getTosapiAppsecret();
        String basicToken = Base64.getEncoder().encodeToString(content.getBytes());
        String path = "/oauth/token";
        Map<String, String> headers = new HashMap<>();
        //最后在header中的格式(中间是英文空格)为Authorization:
        headers.put("Authorization", "Basic " + basicToken);
        //根据API的要求，定义相对应的Content-Type
        headers.put("Content-Type", "application/form-data");
        Map<String, String> querys = new HashMap<>();
        querys.put("grant_type", "refresh_token");
        querys.put("refresh_token", tokenObject.toString());
        // 拼装请求body的json字符串
        String bodys = "";
        try {
            HttpResponse response = HttpUtils.doPost(TOS_API_DOMIAN, path, "POST", headers, querys, bodys);
            int stat = response.getStatusLine().getStatusCode();
            if (stat == 200){
                String res = EntityUtils.toString(response.getEntity());
//                log.info("res_obj:{} ",res);
                JSONObject resObj = JSONObject.parseObject(res);
                TosApiBaseResDTO resDTO = JSONObject.parseObject(res, TosApiBaseResDTO.class);
//                log.info("resDTO:{}", resDTO);
                if(resDTO.isSuccess()){
                    String data = resObj.getString("data");
                    TosApiTokenDTO tokenDTO = JSONObject.parseObject(data, TosApiTokenDTO.class);
//                    log.info("tokenDTO:{}", tokenDTO);
                    redisUtil.set(TosApiConstant.TOSAPI_TOKEN_KEY, tokenDTO.getAccess_token(), tokenDTO.getExpires_in()- 18000);
                    redisUtil.set(TosApiConstant.TOSAPI_REFRESHTOKEN_KEY, tokenDTO.getRefresh_token(), tokenDTO.getExpires_in()- 18000);
                    return tokenDTO.getAccess_token();
                }
            }else{
                log.info("Http code: {}  | http header error msg:{} | Http body error msg: ",
                        stat, response.getFirstHeader("X-Ca-Error-Message"), EntityUtils.toString(response.getEntity()));
//                resDTO.setMessage("HTTP请求失败！" + stat);
            }
        } catch (Exception e) {
            log.info("Exception :{} ",e.getMessage());
        }
        return StringUtils.EMPTY;
    }

    //业务接口认证公共头部
    private Map<String, String> getHeaders(String token){
        Map<String, String> headers = new HashMap<>();
        //Authorization: Bearer+/oauth/token 接⼝返回的 access_token:
        headers.put("Authorization", "Bearer " + token);
        //企业⽤户的税号
        headers.put("X-COMPANY-TAX", TosApiConstant.X_COMPANY_TAX);
        //根据API的要求，定义相对应的Content-Type
        headers.put("Content-Type", "application/json; charset=UTF-8");
        return headers;
    }
    //业务通用请求
    public TosApiBaseResDTO postDTO(String path, Object DTO){
        HyConfig systemConfig = HyConfigUtils.getConfig();
        if(systemConfig == null || !systemConfig.getTosapiIzUse()){
            throw new JeecgBootException("珠海快货运服务暂未开启,请联系管理员。");
        }
        TosApiBaseResDTO resDTO = new TosApiBaseResDTO();
        if(DTO== null){
            resDTO.setBiz_message("提交数据不能为空！");
            return resDTO;
        }

        String token = getToken();
        //判断token空
        if(StringUtils.isEmpty(token)) {
            resDTO.setBiz_message("Token为空！");
            return resDTO;
        }

        Map <String, String> headers = getHeaders(token);
        Map<String, String> querys = new HashMap<>();
        String bodys = JSONObject.toJSONString(DTO);
        if(path.endsWith("supplement") || path.endsWith("transport/detail")){
             bodys = "["+bodys+"]";
        }

//        log.info("postDTO url :{} bodys :{}", TOS_API_DOMIAN + TosApiConstant.TOS_API_PATH_SUBFIX + path, bodys);
        try {
            HttpResponse response = HttpUtils.doPost(TOS_API_DOMIAN, TosApiConstant.TOS_API_PATH_SUBFIX + path, "POST", headers, querys, bodys);
            int stat = response.getStatusLine().getStatusCode();
            if (stat == 200){
                String res = EntityUtils.toString(response.getEntity());
//                log.info("postDTO res_obj :{} ",res);
                resDTO = JSONObject.parseObject(res, TosApiBaseResDTO.class);
            }else{
                log.info("postDTO Http code: {}  | http header error msg: {} | Http body error msg: {}",
                        stat, response.getFirstHeader("X-Ca-Error-Message"), EntityUtils.toString(response.getEntity()));
                resDTO.setBiz_message("HTTP请求失败！" + stat);
            }
        } catch (Exception e) {
            log.info("postDTO Exception :{} ",e.getMessage());
            resDTO.setBiz_message("操作失败！" + e.getMessage());
        }
        return resDTO;
    }
    //3.1 文件上传接口
    //文件上传接口最大限制5m，支持格式：jpeg、jpg、png、gif、bmp、pdf
    public String uploadFile(String file){
        HyConfig systemConfig = HyConfigUtils.getConfig();
        if(systemConfig == null || !systemConfig.getTosapiIzUse()){
            throw new JeecgBootException("珠海快货运服务暂未开启,请联系管理员。");
        }
//        System.out.println("文件上传接口 文件路径：" + file);
        String token = getToken();
        //判断token空
        if(StringUtils.isEmpty(token)) {
            return StringUtils.EMPTY;
        }

        String wholefile = uploadpath + File.separator + file;
        String path = "/file/upload";
        Map<String, String> headers  = getHeaders(token);
//        log.info("uploadFile url :{} file:{}", TOS_API_DOMIAN + TosApiConstant.TOS_API_PATH_SUBFIX + path, wholefile);
        try {
            URL url =  new URL(TOS_API_DOMIAN + TosApiConstant.TOS_API_PATH_SUBFIX + path);


            String result = WebUtils.uploadImg2Tos(url, new File(wholefile), headers);
//            log.info("uploadFile result :{}  file:{}", result, wholefile);
            if(StringUtils.isNotEmpty(result)){
                TosApiBaseResDTO resDTO = JSONObject.parseObject(result, TosApiBaseResDTO.class);
//                log.info("uploadFile resDTO :{}  file:{}", resDTO, wholefile);
                if(resDTO.isSuccess()){
                    return resDTO.getData().toString();
                }

            }
        } catch (Exception e) {
            log.info("uploadFile Exception :{} file:{}",e.getMessage(), wholefile);
        }
        return StringUtils.EMPTY;
    }
    //2.1上报承运人（用司机信息）
    public TosApiBaseResDTO subjectCarrier(CarrierDTO carrierDTO){
        return postDTO("/subject/carrier", carrierDTO);
    }
    //2.2上报托运人（货主）
    public TosApiBaseResDTO subjectCustomer(CustomerDTO customerDTO){
        return postDTO("/subject/consignor", customerDTO);
    }
    //2.3上报车辆
    public TosApiBaseResDTO subjectVehicle(VehicleDTO vehicleDTO){
        return postDTO("/subject/vehicle", vehicleDTO);
    }
    //2.4上报司机
    public TosApiBaseResDTO subjectDriver(DriverDTO driverDTO){
        return postDTO("/subject/driver", driverDTO);
    }

    /*********************运单API（数据分开上报） start ***********************/


    /**
     * 创建运单
     * @param createShippingNoteDTO
     * @return
     */
    public TosApiBaseResDTO waybillCreate(CreateShippingNoteDTO createShippingNoteDTO){
        return postDTO("/waybill/create", createShippingNoteDTO);
    }

    /**
     * 上传合同信息
     * 1.承运人合同必传，不传合同无法开票
     * 2.广东地区申请牌照的客户托运人合同、承运人合同都必传
     * @param contractDTO
     * @return
     */
    public TosApiBaseResDTO waybillContract(ContractDTO contractDTO){
        return postDTO("/waybill/contract", contractDTO);
    }

    /**
     * ETC发票上报
     * @param etcDTO
     * @return
     */
    public TosApiBaseResDTO waybillEtcCreate(EtcDTO etcDTO){
        return postDTO("/waybill/etc/create", etcDTO);
    }

    /**
     * 上传运单轨迹
     * @param geoDTO
     * @return
     */
    public TosApiBaseResDTO waybillGeo(GeoDTO geoDTO){
        return postDTO("/waybill/geo", geoDTO);
    }

    /**
     * 上传资金流水
     * 承运人资金流水必传，不传承运人资金流水无法进行开承运人发票
     * @param paymentDTO
     * @return
     */
    public TosApiBaseResDTO waybillPayment(PaymentDTO paymentDTO){
        return postDTO("/waybill/payment", paymentDTO);
    }

    /**
     * 上传运输节点信息
     * @param transportDetailDTO
     * @return
     */
    public TosApiBaseResDTO waybillTransportDetail(TransportDetailDTO transportDetailDTO){
        return postDTO("/waybill/transport/detail", transportDetailDTO);
    }

    /**
     * 运单补充信息接口
     * 补充信息上传后，有审核流程，审核通过后，运单可开票
     * @param supplementDTO
     * @return
     */
    public TosApiBaseResDTO waybillSupplement(SupplementDTO supplementDTO){
        return postDTO("/waybill/supplement", supplementDTO);
    }

    /**
     * 运单确认接口
     * 1.运单确认接口也会返回数据自检结果，有可能为空；
     * 2.数据自检结果非实时返回，取决于运单数据自检的队列长度，若确认时未返回自检结果，可通过运单自检结果查询接口获取自检结果
     * @param waybillNoList
     * @return
     */
    public TosApiBaseResDTO waybillConfirm(List <String> waybillNoList){
        return postDTO("/waybill/confirm", waybillNoList);
    }

    /**
     * 运单自检结果查询接口
     * @param waybillNoList
     * @return
     */
    public TosApiBaseResDTO invoiceWaybillCheck(List <String> waybillNoList){
        return postDTO("/invoice/waybill/check", waybillNoList);
    }

    /*********************运单API（数据分开上报） end***********************/

    /*********************发票API start ***********************/

    /**
     * 开票申请接口
     * 运单自检通过，可开票后，进行开票申请的接口；
     * @param invoiceApplyDTO
     * @return
     */
    public TosApiBaseResDTO invoiceApply(InvoiceApplyDTO invoiceApplyDTO){
        return postDTO("/invoice/apply", invoiceApplyDTO);
    }

    /**
     * 开票确认
     * 开票申请后，根据确认的开票金额进行开票确认
     * @param invoiceQueryDTO
     * @return
     */
    public TosApiBaseResDTO invoiceConfirm(InvoiceQueryDTO invoiceQueryDTO){
        return postDTO("/invoice/confirm", invoiceQueryDTO);
    }

    /**
     * 开票金额查询
     * 查询可开票金额【开票申请金额和产业园计算的开票金额不一致时使用】
     * @param invoiceQueryDTO
     * @return
     */
    public TosApiBaseResDTO invoiceMoney(InvoiceQueryDTO invoiceQueryDTO){
        return postDTO("/invoice/money", invoiceQueryDTO);
    }

    /**
     * 开票结果查询  查询运单开票结果
     * @param invoiceQueryDTO
     * @return
     */
    public TosApiBaseResDTO invoiceResult(InvoiceQueryDTO invoiceQueryDTO){
        return postDTO("/invoice/result", invoiceQueryDTO);
    }

    /**
     * 税率查询
     * 查询税率信息，用于计算开票金额
     * @param invoiceQueryDTO
     * @return
     */
    public TosApiBaseResDTO invoiceTaxRate(InvoiceQueryDTO invoiceQueryDTO){
        return postDTO("/invoice/tax-rate", invoiceQueryDTO);
    }

    /*********************发票API  end***********************/

    public DriverDTO getDriverDTO(){
        DriverDTO driverDTO = new DriverDTO();
        driverDTO.setName("赵庆丰");//	司机姓名	是		an..30
        driverDTO.setPhone("18340812904");//	电话	是		n11
        driverDTO.setIdentity("130429197707242632");//	司机身份证号	是		an..18
        driverDTO.setLicence("130429197707242632");//	驾驶证号	是		an..18
        driverDTO.setDriving_class("A2");//	准驾车型	是	根据驾驶证填写	an..20
        driverDTO.setLicence_issuing("河北省邯郸市公安局交通警察支队");//	驾驶证发证机关	是		an..30
        driverDTO.setValid_from("2012-12-18");//	驾驶证有效期自	是	13位毫秒时间戳。eg：1577811661000。时间范围不得跨越，	n13
        driverDTO.setValid_to("2022-12-18");//	驾驶证有效期至	是	13位毫秒时间戳。eg：1577811661000；长期传2099-12-31的13位毫秒时间戳	n13
        driverDTO.setQualification_cert_no("130429000000000000");//	从业资格证号	是	无的情况下填写“驾驶员身份证前6位+000000000000	an..19
        driverDTO.setQualification_cert_class("");//	驾驶员信息-从业资格类别	否	广东地区必填：包含经营性道路货物运输驾驶员、道路危险货物运输驾驶员、其他、无等四类	an..50
        driverDTO.setIdentity_frontal_pic(uploadFile("yyf.jpg"));//	身份证正面照图片URL	是	文件上传接口返回的地址	an..1024
        driverDTO.setIdentity_reverse_pic(uploadFile("yyf.jpg"));//	身份证反面照图片URL	是	文件上传接口返回的地址	an..1024

        //户籍地址/常住地址必填一组
        driverDTO.setHousehold_region("130400");//	户籍地址行政区划	参考代码集行政区划	code http://www.mca.gov.cn/article/sj/xzqh/2020/2020/202003301019.html
        driverDTO.setHousehold_address("河北省邯郸市永年县正西乡后朱庄村八区26号");//	户籍地址详细地址		an..128

        driverDTO.setLicence_frontal_pic(uploadFile("yyf.jpg"));//	驾驶证正面照图片URL	是	文件上传接口	an..1024
        driverDTO.setLicence_reverse_pic(uploadFile("yyf.jpg"));//	驾驶证反面照图片URL	是	文件上传接口	an..1024

        return driverDTO;
    }
    public VehicleDTO getVehicleDTO(){
        VehicleDTO vehicleDTO = new VehicleDTO();
        vehicleDTO.setPlate_number("冀A0462W");//	车辆牌照号	an..35	是	车牌号校验
        vehicleDTO.setPlate_color(PlateColorEnum.YELLOW.getCode());//	车牌颜色代码	an..2	是	限制于代码集，
        vehicleDTO.setType("Q11");//	车辆类型代码	an..3	是	限制于代码集【文档末尾代码集】
        vehicleDTO.setOwner("元民县宗美汽车运输有限公司");//	车辆所有人	an..128	是
        vehicleDTO.setUse_character("货运");//	使用性质	an..20	是
        vehicleDTO.setDriving_licence_frontal_pic(uploadFile("yyf.jpg"));//	行驶证正面照图片URL	an.1024	是	文件上传接口返回的地址
        vehicleDTO.setDriving_licence_reverse_pic(uploadFile("yyf.jpg"));//	行驶证反面照图片URL	an..1024	是	文件上传接口返回的地址
//        vehicleDTO.setDriving_licence_valid_to("");//	强制报废期	n13	否	13位毫秒时间戳
        vehicleDTO.setVin("LRDS6PTB4ET018915");//	车辆识别代号	an..32	是
        vehicleDTO.setLicence_issuing("河北省石家庄市公安局交通警察支队");//	发证机关	an..128	是
        vehicleDTO.setRegister_date("2014-12-17");//	注册日期	n13	是
        vehicleDTO.setIssue_date("2019-05-24");//	发证日期	n13	是
        vehicleDTO.setEnergy_type(EnergyTypeEnum.NATURAL_GAS.getCode());//	车辆能源类型	an..12	是	限制于代码集，

    /*
        核定载质量：车辆核定可以承载货物的总重量；
        车辆为半挂车时，核定载质量=准牵引总质量
        车辆为全挂车时，核定载质量=核定载质量+准牵引总质量
        其他类型车辆，按照行驶证填写；
        Minimumvalue:0.1Maximumvalue:99
    */
        vehicleDTO.setRatified_load_capacity("38.07");//	核定载质量	n..9,2	是	必填，参考机动车行驶证填写，默认单位：吨，保留两位小数，如整数的话，以.00填充。

    /*
        半挂车：吨位=车辆整备质量+准牵引总质量
        全挂车：吨位=车辆整备质量+核定载质量+准牵引总质量
        其他类型车辆，按照行驶证填写
    */
        vehicleDTO.setTonnage("45.87");//	吨位	n..9,2	是	必填，车辆总质量，默认单位：吨，保留两位小数，如整数的话，以.00填充。小数点不计入总长。

        vehicleDTO.setMaster_name("元民县宗美汽车运输有限公司");//	业户名称	an..128	是	车辆道路运输证上的业户名称
        vehicleDTO.setTransport_licence_no("130132126222");//	道路运输证号	n6..20	是	必填，总质量4.5吨及以下普通货运车辆的，可填“车籍地6位行政区域代码+000000”。Pattern:"^\\d{6,20}$"
        vehicleDTO.setTransport_licence_valid_to("2020-12-30");//	道路运输证有效期至	n13	是	13位毫秒时间戳。eg：1577811661000，长期传2099-12-31的13位毫秒时间戳
        vehicleDTO.setTransport_licence_frontal_pic(uploadFile("yyf.jpg"));//	道路运输证正面照图片URL		是	文件上传接口返回的地址
        vehicleDTO.setTransport_licence_reverse_pic(uploadFile("yyf.jpg"));//	道路运输证反面照图片URL		是	文件上传接口返回的地址
        vehicleDTO.setTransport_business_cert_no("130132001389");//	道路运输经营许可证号	n12..20	是	车辆所属业户的道路运输经营许可证编号，没有就填车籍地6位行政区划代码+000000，吨位小于等于4.5吨时，道路运输证号和道路运输经营许可证号不能相同

        vehicleDTO.setTrailer_plate_number("冀A0462W");//	挂车牌照号	an..35	否	当车辆类型代码首字母=B/G/Q时必填，其它情况下，非必填
        vehicleDTO.setTrailer_plate_color(PlateColorEnum.YELLOW.getCode());//	挂车牌照颜色代码	an..35	否	当车辆类型代码首字母=B/G/Q时必填，其它情况下，非必填
//        vehicleDTO.setApproved_time("");//	营运车辆信息-通过平台审核日期	n13	否	13位毫秒时间戳。eg：1577811661000 广东地区客户必填，否则不传时上报交通取车辆创建时间
//
//        vehicleDTO.setAccident_flag(null);//	运输产生安全事故-是否发生		否	enum(NO,YES)
//        vehicleDTO.setAccident_handle_flag(null);//	运输产生安全事故-是否处理完成		否	enum(NO,YES)
//        vehicleDTO.setAccident_indemnity_fla(null);//	保险赔付-是否发生赔付		否	enum(NO,YES)
//        vehicleDTO.setIndemnity_amount("");//	保险赔付-赔付金额	n..18,3	否	单位：分，保留3位小数
//        vehicleDTO.setQuality_complaints_flag(null);//	服务质量投诉-是否发生		否	enum(NO,YES)
//        vehicleDTO.setComplaints_handle_flag(null);//	服务质量投诉-是否处理完成		否	enum(NO,YES)
        return vehicleDTO;
    }
    public CustomerDTO getCustomerDTO(){
        CustomerDTO customerDTO = new CustomerDTO();
        //字段名称英文	字段名称中文	是否必填	字段限制	备注
        customerDTO.setName("天津中鑫恒国际贸易有限公司");//	托运人名称	是	an..512	企业名称或个人姓名，不能为空，并只允许出现字母数字中文字符，并且字段长度不得超过 512 ，广州@填单位或个人，如集装箱运输业务无法明确实际发货人可填写货代信息，所有企业名称不能超过33个中文字符，
        customerDTO.setPhone("17692986565");//	企业联系人手机号或者个人手机号	是	n..18
        //个人必填
        if("是个人".equals("是个人")) {
            customerDTO.setEnterprise_flag(YNEnum.NO.getCode());//	是否是企业	是		enum (NO, YES)
            customerDTO.setIdentity("130521198502141570");//	个人身份证号	个人必填	an..18
            customerDTO.setIdentity_frontal_pic(uploadFile("yyf.jpg"));//	身份证正面照图片URL	个人必填	an..1024
            customerDTO.setIdentity_reverse_pic(uploadFile("yyf.jpg"));//	身份证反面照片图片URL	个人必填	an..1024
            //个人类型时户籍地址和常驻地址个人必传一组
            customerDTO.setHousehold_region("120116");//	户籍地址行政区划		an..12	参考行政区划代码集
            customerDTO.setHousehold_address("天津市滨海新区临港怡湾广场3-208-05/06室");//	户籍地址详细地址		an..256
        }else{
            customerDTO.setEnterprise_flag(YNEnum.YES.getCode());//	是否是企业	是		enum (NO, YES)
            customerDTO.setSocial_credit_code("91120116MA06LAWP2G");//	社会信用代码	企业必填	an..35
            customerDTO.setContacts_name("卢强");//	企业联系人	企业选填	an..30
            customerDTO.setBusiness_license_pic(uploadFile("yyf.jpg"));//	营业执照图片URL	企业必填	an..1024
            customerDTO.setLegal_person_name("王剑勇");//	法人姓名	否	an..30
//        customerDTO.setLegal_person_identity("");//	法人身份证号	否	an..18

            //企业类型时注册地址和经营地址必传一组
            customerDTO.setRegister_region("120116");//	注册地址行政区划		an..12	参考行政区划代码集
            customerDTO.setRegister_address("天津市滨海新区临港怡湾广场3-208-05/06室");//	注册地址详细地址		an..256
        }

        return customerDTO;
    }
    public CarrierDTO getCarrierDTO(){
        CarrierDTO carrierDTO = new CarrierDTO();
        carrierDTO.setEnterprise_flag(YNEnum.NO.getCode());//	是否是企业	是		enum (NO, YES)
        carrierDTO.setName("赵庆丰");//	实际承运人名称	是	an..256	与网络货运经营者签订运输合同，实际完成运输的经营者。取得道路运输经营许可证的运输业户，直接填写“许可证上的业户名称”；其他情况填写“运输公司名称（合同签订人姓名）”。
//        carrierDTO.setActual_carrier_business_license("");//	实际承运人道路运输经营许可证号	企业必填	an..50	实际承运人的道路运输经营许可证编号，网络货运经营者整合车辆全部为总质量 4.5 吨及以下普通货运车辆的，可填“车籍地 6 位行政区域代码+000000”。
        carrierDTO.setActual_carrier_register_address("河北省邯郸市永年县正西乡后朱庄村八区26号");//	实际承运人信息-注册地	是	an..512	如果为个体司机，注册地按营运车辆车籍地填写
//        carrierDTO.setActual_carrier_biz_scope("");//	实际承运人信息-道路运输经营范围	企业必填	an..512	实际承运人为企业必填
//        carrierDTO.setActual_carrier_audit_time("");//	实际承运人信息-通过平台审核日期	否	n13	13 位毫秒时间戳。eg：1577811661000

        carrierDTO.setPhone("18340812904");//	企业联系人手机号或者个人手机号	是	an..18

        carrierDTO.setIdentity("130429197707242632");//	个人身份证号	个人必填	an..18
        carrierDTO.setIdentity_frontal_pic(uploadFile("yyf.jpg"));//	身份证正面照图片 URL	个人必填	an..1024	文件上传接口返回地址
        carrierDTO.setIdentity_reverse_pic(uploadFile("yyf.jpg"));//	身份证反面照片图片 URL	个人必填	an..1024	文件上传接口返回地址

        //个人类型时，户籍地址和常驻地址个人必传一组
        carrierDTO.setHousehold_region("130400");//	户籍地址行政区划		an..12	参考行政区划代码集
        carrierDTO.setHousehold_address("河北省邯郸市永年县正西乡后朱庄村八区26号");//	户籍地址详细地址		an..256

        return carrierDTO;
    }
    public static void main(String[] args) {
        TosApiService tosApiService = new TosApiService();
//        String token = tosApiService.getToken();
//        String token1 = tosApiService.refreshToken(token);
//        System.out.println(token1);

//        上传文件
//        String url = tosApiService.uploadFile("1624849619435_1624849614007_1624849620736.jpg");
//        System.out.println("上传文件: " + url);

//        上报司机
//        TosApiBaseResDTO resDTO = tosApiService.subjectDriver(tosApiService.getDriverDTO());
//        System.out.println("上报司机 " + resDTO.getBiz_message());

//        上报车辆
//        TosApiBaseResDTO resDTO = tosApiService.subjectVehicle(tosApiService.getVehicleDTO());
//        System.out.println("上报车辆 " + resDTO.getBiz_message());

//        上报托运人（货主）
        TosApiBaseResDTO resDTO = tosApiService.subjectCustomer(tosApiService.getCustomerDTO());
        System.out.println("上报托运人（货主） " + resDTO.getBiz_message());
//
//        上报承运人（先用司机信息）
//        TosApiBaseResDTO resDTO = tosApiService.subjectCarrier(tosApiService.getCarrierDTO());
//        System.out.println("上报承运人 " + resDTO.getBiz_message());

    }
}
